#include <iostream>
#include <memory>

#include "TcpServer.hpp"
#include "Log.hpp"
#include "Protocol.hpp"
#include "Calculator.hpp"
#include "Daemon.hpp"
using namespace LogMudule;

using cal_fun = std::function<Response(const Request &request)>;

class Parse // 解析报文
{
public:
    Parse(cal_fun cal) : _cal(cal) {}
    std::string CalEntry(std::string &package)
    {
        // 1. 判断报文的完整性
        std::string message;
        std::string resp_str;
        while (Decode(package, &message))
        {
            if (message.empty())
                break;

            // 2. 反序列化，客服端请求
            Request request;
            if (!request.Deserialize(message))
                break;


            // 3. 计算，服务端响应
            Response response = _cal(request);

            // 4. 序列化
            std::string resp_string;
            response.Serialize(resp_string);

            // 5. 打包
            Encode(resp_string);

            // 6. 拼接应答
            resp_str += resp_string;
        }

        return resp_str;
    }
    ~Parse() {}
private: 
    cal_fun _cal;
};


int main()
{
    // ENABLE_CONSOLE_LOG();
    ENABLE_FILE_LOG();
    // 0. 守护进程
    Daemon(false, false);
    // 1. 计算模块
    Calculator mycal;

    // 2. 解析模块
    Parse mypare([&mycal](const Request &request) { return mycal.Execute(request); });

    // 3. 服务器模块
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>([&mypare](std::string &package){
        return mypare.CalEntry(package);
    });

    // 4. 初始化服务
    tsvr->InitServer();
    // 5. 启动服务
    tsvr->Start();
    return 0;
}